#ifndef __CMDFUNC__
#define __CMDFUNC__

#include "54func.h"
#define TRAINLEN 1000

// server的实际根目录
extern char rootDir[128];
extern char log_addr[128];

// 结构体定义
// 用于接收C的字符串cmd
typedef struct {
    char cmdToken[8];
    char user[20];
    int argc;
    char argv1[256];
    char argv2[256];
} cmd_t;

// cwd栈的结点(双向链表)
typedef struct pathToken_s{
    char data[255];
    struct pathToken_s *pfront; 
    struct pathToken_s *pnext; 
} pathToken_t;

// cwd栈
typedef struct {
    pathToken_t *top;
    pathToken_t *bottom;
    int size;
} cwd_t;

// 小火车
typedef struct train_s
{
    int length;
    char data[TRAINLEN];
} train_t;


// 辅助函数
// recvn                                                                                                                                   
int recvn(int netfd, void *buf, int length);
// 判断路径是否是传入用户所拥有的合法路径
// 返回值: 1(路径正确), 0(路径不正确) 
int pathJudge(MYSQL* conn, const char* realPath, const char* user, const char *type);
// 获取cwd, 并将其存储在pwdstr中 
int getPath(const cwd_t *pcwd, char *pwdstr);
// 根据传入的路径(cmd_t结构体中的一个argv字符串,可相对可绝对)
// 获取一个数据库目录系统的绝对路径
int realPath(cwd_t *pcwd, char *argv, char *mergePath);
// 接收确认信息'e'或'o', 信息为'o'时返回1, 为'e'时读取报错信息, 返回0
int recvMsg(int sockfd, train_t* ptrain);
// 用小火车发送字符串
int strSend(int netfd, train_t* ptrain, const char* str);
// 发送成功信息'o'
int successSend(int netfd);
// 发送错误信息, 如果填入NULL, 发送一个'e'报错信号
// 如果填入字符串, 将其作为报错信息发送给客户端
int errorSend(int netfd, const char* errorMsg);
// 获取传入路径的最后一个文件的preid, 存储在ppreid中
int getPreid(MYSQL* conn, char* user, char* filePath, int* ppreid);
// filesystem插表操作
int insertFileTable(MYSQL *conn,cwd_t *pcwd,cmd_t *pcmd,char *sha1Num);


// 指令函数
// 传入cmd_t，解析并执行相应的指令函数,传入cwd_t为指令函数传参
int cmdServerHandler(MYSQL* conn, int netfd, cwd_t *pcwd, cmd_t *pcmd);
// 获取cwd, 并将其发送给客户端
int pwdCmd(int netfd, const cwd_t *pcwd);
// cd指令,修改cwd栈,cmd_t获取指令及参数
int cdCmd(MYSQL* conn, int netfd, cwd_t *pcwd, cmd_t *pcmd);
// ls指令,cwd_t获取cwd,cmd_t获取指令及参数
int lsCmd(MYSQL* conn, int netfd, cwd_t *pcwd, cmd_t *pcmd);
// rm指令,cwd_t获取cwd,cmd_t获取指令及参数
int rmCmd(MYSQL *conn, int netfd, cwd_t *pcwd, cmd_t *pcmd);
// mkdir指令,cwd_t获取cwd,cmd_t获取指令及参数
int mkdirCmd(MYSQL *conn, int netfd, cwd_t *pcwd, cmd_t *pcmd);

// 发送文件,cwd_t获取cwd,cmd_t获取指令及参数
int serverPuts(MYSQL *conn, int netfd, cwd_t *pcwd, cmd_t *pcmd);
// 接收文件,cwd_t获取cwd,cmd_t获取指令及参数
int serverGets(MYSQL *conn, int netfd, cwd_t *pcwd, cmd_t *pcmd);

// 登录用户,cmd_t获取指令及参数
int userLogin(MYSQL *conn, int netfd, const cmd_t *pcmd);
// 退出登录
int userLogout(cwd_t *pcwd);
// 创建用户,cmd_t获取指令及参数
int userAdd(MYSQL *conn, int netfd, cwd_t *pcwd, cmd_t *pcmd);
// 删除用户,cmd_t获取指令及参数
int userDel(MYSQL *conn, int netfd, const cmd_t *pcmd);

#endif
